package 栈;


import java.util.Stack;

/**
 * 栈: 字符串解码 https://leetcode.cn/problems/decode-string/description/
 */
public class likou394 {

    // 用栈来模拟
    public String decodeString(String s1) {
        // 用来存放数字的栈和字符串的栈
        // 栈里面放入 StringBuffer 方便字符串进行拼接
        Stack<StringBuffer> str = new Stack<>();
        str.push(new StringBuffer()); // 先放入一个空串, 为了统一串接字符串操作
        Stack<Integer> nums = new Stack<>();
        int n = s1.length(), i = 0;
        char[] s = s1.toCharArray();
        while(i < n) {
            // 1. 是数字. 提取出数字
            if(s[i] >= '0' && s[i] <= '9') {
                // 提取出数字
                int tmp = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9') {
                    // 注意这里写成 带括号的最好(str[i] - '0') 先计算, 防止溢出
                    tmp = tmp * 10 + (s[i] - '0');
                    i++;
                }
                // 丢入到数字栈中
                nums.push(tmp);
                // 2. 是左括号, 把后面的字符串串出来, 跟数字一样
            } else if(s[i] == '[') {
                i++; //  先走一步, 把后面的字符串串起来
                StringBuffer tmp = new StringBuffer();
                while(i < n && s[i] >= 'a' && s[i] <= 'z') {
                    tmp.append(s[i]);
                    i++;
                }
                // 然后放入字符串栈
                str.push(tmp);
                // 3. 是右括号
            } else if(s[i] == ']') {
                // 就是解析
                StringBuffer tmp = str.pop();
                int k = nums.pop();
                while(k != 0) {
                    // 拼接在字符串栈顶元素的后面. 前面栈顶预先放了一个空串, 就是为了防止 peek出来的是空的 null
                    str.peek().append(tmp);
                    k--;
                }
                i++;
                // 4. 纯字母, 取出所有,直接拼在栈顶元素的后面
            } else {
                StringBuffer tmp = new StringBuffer();
                while(i < n && s[i] >= 'a' && s[i] <= 'z') {
                    tmp.append(s[i]);
                    i++;
                }
                // 拼接在栈顶元素的后面
                str.peek().append(tmp);
            }
        }
        // 字符串栈 栈顶的就是答案
        return str.pop().toString();
    }

}
